package findRotation;

import java.util.Arrays;

public class Solution {
    public boolean findRotation(int[][] mat, int[][] target) {
        int k = 4;
        while (k>0){
            rotate(mat);
            for (int i = 0; i < mat.length; i++) {
                System.out.println(Arrays.toString(mat[i]));
            }
            if(check(mat,target)){
                return true;
            }
            k--;
        }
        return false;
    }
//    private void rotate(int[][] mat){
//        int n = mat.length;
//        int [][] rotateMat = new int[n][n];
//        for (int i = 0; i < n; i++) {
//            for (int j = 0; j < n; j++) {
//                rotateMat[j][i] = mat[i][j];
//            }
//        }
//        for (int i = 0; i < n; i++) {
//            for (int j = 0; j < n; j++) {
//                mat[i][j] = rotateMat[i][j];
//            }
//        }
//    }
    // 原地旋转矩阵
    private void rotate(int[][] mat){
        // 思路 mat[i][j]应该移动到哪里呢？
        // 应该移动到mat[j][n-i-1]的位置----mat[j][n-i-1] = mat[i][j]
        // 记住这个公式
        //           tmp = mat[j][n-i-1]; mat[j][n-i-1] = mat[i][j]
        //           那么mat[j][n-i-1]需要旋转到哪里呢？--- 再次带入公式中
        //             mat[n-i-1][n-j-1] 同理，mat[n-i-1][n-j-1] = temp;
        //             继续带入 mat[n-i-1][n-j-1] --- mat[n-j-1][i] --- mat[i][j]
        //               由此可以看出每次旋转的时候都是这四个变量循环交换的过程
        //              mat[i][j] -- mat[j][n-i-1] -- mat[n-i-1][n-j-1] --- mat[n-j-1][i];
        //             因此 只需要交换这四个变量的值就可以了
        //             那么需要枚举哪些位置呢？
        //             可以看出 每次交换都是以一圈一圈的形式来的 所以每次只需要枚举每圈的第一排的数字即可
        int n = mat.length;
        for (int i = 0; i < n/2; i++) {
            for (int j = i; j <n-i-1; j++) {
                // 交换这四个数字
                int tmp = mat[n-j-1][i];
                mat[n-j-1][i] = mat[n-i-1][n-j-1];
                mat[n-i-1][n-j-1] = mat[j][n-i-1];
                mat[j][n-i-1] = mat[i][j];
                mat[i][j] = tmp;
            }
        }
    }
    private boolean check(int[][] mat,int[][] target){
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat.length; j++) {
                if(mat[i][j] != target[i][j]){
                    return false;
                }
            }
        }
        return true;
    }
}
